package com.atguigu.springbootdemo.controller;

import com.atguigu.springbootdemo.bean.Employee;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * Created by Smexy on 2023/1/7
 *
 *  @Controller:
 *          作用：
 *                  ①给自己人看，表明这是一个控制器
 *                  ②给Spring容器看，当容器扫描到顶了这个注解的类时，容器会自动识别，这是一个控制器。
 *                          会自动为这个类在容器中创建一个单例对象
 */
//@Controller
    @RestController // 等价于 @Controller + 为这个类的所有方法默认标注@ResponseBody
public class HelloController
{
    //方法一定要有返回值
    @RequestMapping(value = "/hello")
    public Object handle(){
        System.out.println("收到了Hello请求");

        //http://localhost:8080(省略)  /a.html
        return "/a.html";
    }

    /*
        响应数据:  @ResponseBody,将方法的返回值直接作为数据放入 reponse响应

                数据分为:
                    字面量：  字面上就能看出变量值的变量。
                           常见的基本数据类型及包装类，String
                            int i = 3
                            Springboot直接将变量放入reponse响应

                    非字面量:  字面上看不出变量值的变量。
                            Employee e = new Employee()
                            Springboot将变量转换为jsonstr格式后放入reponse响应

          返回数据： 编写数据接口，简称写接口！
     */
   // @ResponseBody
    @RequestMapping(value = "/getData1")
    public Object handle1(){

        return "/a.html";
    }

    //@ResponseBody
    @RequestMapping(value = "/getData2")
    public Object handle2(){

        Employee employee = new Employee(1, "jack", "aa", "male");
        return employee;
    }

    /*
        如果前台发送的是普通参数，只需要在方法的形参位置声明
            和普通参数名一模一样的参数即可。
            类型兼容即可。
     */
    @RequestMapping(value = "/sendParam")
    public Object handle3(String name,Integer age){

        System.out.println("name:"+name+",age:"+age);

        return "ok";
    }

    /*
        接收json格式的参数，形参前需要添加@RequestBody

       如果前台发送的是不普通参数，通常是json格式的参数。
            需要在处理方法的形参位置使用 POJO(Bean)接收，Bean的属性名得和json的属性名一致，才能封装成功。
            或者还可以使用Map接收。

            json格式的数据，需要写js代码发送！ 需要使用工具发送！

    */
    @RequestMapping(value = "/sendJson")
    public Object handle4(
        @RequestBody Employee employee
      // @RequestBody Map<String,Object> employee
    ){

        System.out.println(employee);

        return "ok";
    }


    /*
            获取路径变量中的参数，需要在获取变量的部分，使用{xxx}进行占位，
            在参数上，使用@PathVariable("xx")将路径的变量赋值给形参
     */
    @RequestMapping(value = "/haha/{p}/heihei")
    public Object handle3(@PathVariable("p") String path){

        System.out.println("path:"+path);

        return "ok";
    }

    // Ambiguous mapping. 在服务端的方法中，不能有两个相同@RequestMapping(value='xx')的方法。
    // 不能让两个方法都可以处理同一个请求，引起歧义！
    /*@RequestMapping(value = "/haha/{p}/heihei")
    public Object handle4(@PathVariable("p") String path){

        System.out.println("path:"+path);

        return "ok";
    }*/


    /*
            限制前台发送的请求方式，当前要求，前台只能发post！不接受其他的！

            只要前台发送的请求方式不匹配，报错: type=Method Not Allowed, status=405
     */
    //@PostMapping(value = "/sendRequest")
    @GetMapping(value = "/sendRequest")
    public Object handle5(){

        System.out.println("收到请求!");

        return "ok";
    }
}
